"""
结合时区的日期操作

问题：
    你有一个安排在2012年12月21日早上9:30的电话会议，地点在芝加哥。
    而你的朋友在印度的班加罗尔，那么他应该在当地时间几点参加这个会议呢？
解决方案：
    对几乎所有涉及到时区的问题，你都应该使用 pytz 模块（已不再推荐使用）。
    pytz 模块一个主要用途是将 datetime 库创建的简单日期对象本地化。
"""

from datetime import datetime, timedelta
from pytz import timezone


def use_pytz():
    d = datetime(2018, 5, 28, 23, 1, 0)
    # 芝加哥时间
    central = timezone("US/Central")
    loc_d = central.localize(d)
    # 将芝加哥时间转换为班加罗尔对应的时间
    bang_d = loc_d.astimezone(timezone("Asia/Kolkata"))
    print(d)
    print(loc_d)
    print(bang_d)
    # 输出结果：
    """
    2018-05-28 23:01:00
    2018-05-28 23:01:00-05:00
    2018-05-29 09:31:00+05:30
    """

    # 在本地化日期上执行计算，需要特别注意夏令时转换和细节
    # 比如，在2013年，美国标准夏令时时间开始于本地时间3月13日凌晨2:00(在那时，时间向前跳过一小时)。
    d = datetime(2013, 3, 10, 1, 45)
    loc_d = central.localize(d)
    later = loc_d + timedelta(minutes=30)
    print(loc_d)
    # 结果错误
    print(later)
    # 输出结果：
    """
    2013-03-10 01:45:00-06:00
    2013-03-10 02:15:00-06:00
    """

    # 结果错误是因为它并没有考虑在本地时间中有一小时的跳跃。
    # 为了修正这个错误，可以使用时区对象 normalize() 方法。
    later = central.normalize(loc_d + timedelta(minutes=30))
    print(later)
    # 输出结果：
    """
    2013-03-10 03:15:00-05:00
    """


if __name__ == '__main__':
    use_pytz()
